// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/interpreter/bytecode-node.h"

#include <iomanip>
#include "src/source-position-table.h"

namespace v8 {
namespace internal {
    namespace interpreter {

        void BytecodeNode::Print(std::ostream& os) const
        {
#ifdef DEBUG
            std::ios saved_state(nullptr);
            saved_state.copyfmt(os);
            os << Bytecodes::ToString(bytecode_);

            for (int i = 0; i < operand_count(); ++i) {
                os << ' ' << std::setw(8) << std::setfill('0') << std::hex << operands_[i];
            }
            os.copyfmt(saved_state);

            if (source_info_.is_valid()) {
                os << ' ' << source_info_;
            }
            os << '\n';
#else
            os << static_cast<const void*>(this);
#endif // DEBUG
        }

        bool BytecodeNode::operator==(const BytecodeNode& other) const
        {
            if (this == &other) {
                return true;
            } else if (this->bytecode() != other.bytecode() || this->source_info() != other.source_info()) {
                return false;
            } else {
                for (int i = 0; i < this->operand_count(); ++i) {
                    if (this->operand(i) != other.operand(i)) {
                        return false;
                    }
                }
            }
            return true;
        }

        std::ostream& operator<<(std::ostream& os, const BytecodeNode& node)
        {
            node.Print(os);
            return os;
        }

    } // namespace interpreter
} // namespace internal
} // namespace v8
